﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using Logica;
using EntidadesCompartidas;
using System.Web.UI.HtmlControls;
using System.Web.Script.Serialization;
using System.Net;
using System.IO.Ports;


namespace Smart_House_System
{
    public partial class Formulario_web1 : System.Web.UI.Page
    {
        private static Plano miPlano = new Plano();
        private static Plano miPlanoAdding = new Plano();
        private static Plano miPlanoDeleting = new Plano();
        private static List<Casa> listCasas = new List<Casa>();
        private static int idPlanoProc;

        protected void Page_Load(object sender, EventArgs e)
        {
            
            if (cmbUsu.SelectedIndex > 0)
            {
                ListItem i = cmbUsu.Items[cmbUsu.SelectedIndex];
                string[] misKeys = i.Value.Split('@');
                int i2 = 0;
                string keyO = "";
                foreach (string key in misKeys)
                {
                    i2++;
                    if (i2 == 1)
                    {
                        keyO = key;

                    }
                }
                imgPlano.Attributes["src"] = keyO;
            }

        }

        [WebMethod] // Atributo necesario para trabajar con servicios Webs 
        public static string posicionarObj(string message, string message2, string message3)
        {
            try
            {
                if (message != "" && message != null && message2 == "1")
                {
                    string keys = message;
                    keys = keys.Replace(".", ",");

                    string[] misKeys = keys.Split('/');
                    decimal x = 0;
                    decimal y = 0;
                    int id = 0;
                    int i = 0;
                    string keyO = "";
                    foreach (string key in misKeys)
                    {
                        i++;
                        if (i == 1)
                        {
                            y = Convert.ToDecimal(key);
                        }
                        else if (i == 2)
                        {
                            x = Convert.ToDecimal(key);
                        }
                        else if (i == 3)
                        {
                            id = Convert.ToInt32(key);
                        }
                        else if (i == 4)
                        {
                            keyO = key;
                        }
                    }
                    return grabarColecciones(x, y, id, keyO, message3);
                }
                if (message != "" && message != null && message2 == "2")
                {
                    string objToDelete = message;
                    int idO = 0;
                    string dirO = "";
                    switch (objToDelete.Substring(0, 3))
                    {
                        case "lam":
                            int idLamp = int.Parse(objToDelete.Substring(4, (objToDelete.Length - 4)));
                            int i = 0;
                            foreach (Luz l in miPlano.Luces)
                            {
                                if (l.Id == idLamp)
                                {
                                    miPlanoDeleting.Luces.Add(l);
                                    idO = l.Id;
                                }
                                i++;
                            }
                            var itemToRemove = miPlano.Luces.Single(r => r.Id == idO);
                            miPlano.Luces.Remove(itemToRemove);
                            itemToRemove = null;
                            break;
                        case "cam":
                            string idCam = objToDelete.Substring(3, (objToDelete.Length - 3));
                            foreach (Camara c in miPlano.Camaras)
                            {
                                if (c.DirRtsp == idCam)
                                {
                                    miPlanoDeleting.Camaras.Add(c);
                                    dirO = c.DirRtsp;
                                }
                            }
                            var itemToRemove2 = miPlano.Camaras.Single(r => r.DirRtsp == dirO);
                            miPlano.Camaras.Remove(itemToRemove2);
                            break;
                        case "sen":
                            int idSensor = int.Parse(objToDelete.Substring(6, (objToDelete.Length - 6)));
                            foreach (Sensor s in miPlano.Sensores)
                            {
                                if (s.Id == idSensor)
                                {
                                    miPlanoDeleting.Sensores.Add(s);
                                    idO = s.Id;
                                }
                            }
                            var itemToRemove3 = miPlano.Sensores.Single(r => r.Id == idO);
                            miPlano.Sensores.Remove(itemToRemove3);
                            break;
                        default:
                            return "Tipo de objeto invalido.";
                            break;
                    }
                }
                return "Objeto eliminado.";
            }
            catch (Exception ex)
            {
               // Page.ClientScript.RegisterStartupScript(this.GetType(), "ErrorAlert", "alert('" + ex.Message + "');", true);
                return ex.Message;
            }
        }

        public static string grabarColecciones(decimal x, decimal y, int id, string keyO, string message3)
        {
            try
            {
                string[] misKeys = message3.Split('|');
                int i = 0;
                string itemId = "";
                string itemText = "";
                ListItem item;

                foreach (string key in misKeys)
                {
                    try
                    {
                        i++;
                        if (i == 1)
                        {
                            itemId = key;
                        }
                        if (i == 2)
                        {
                            itemText = key;
                        }
                    }
                    catch (Exception ex)
                    {
                        itemText = "";
                        itemId = "";
                        item = null;
                        throw new Exception(ex.Message);
                    }
                }
                item = new ListItem(itemId, itemText);
                if (item.Text != "")
                {
                    string idPlano = item.Text;
                    string[] arrayP = idPlano.Split(' ');

                    int ind = 0;
                    foreach (string key in arrayP)
                    {
                        ind++;
                        if (ind == 2)
                        {
                            miPlano.Idp = int.Parse(key);
                        }
                    }
                }
                else
                {
                    throw new Exception("Debe seleccionar un Plano.");
                }
                switch (id)
                {
                    case 1:
                        string idOs = keyO;
                        Camara c = new Camara(idOs, false, y, x);
                        foreach (Camara cam in miPlanoAdding.Camaras)
                        {
                            if (c.DirRtsp == cam.DirRtsp)
                            {
                                throw new Exception("Camara " + c.DirRtsp + " ya existe.");
                            }
                        }
                        foreach (Camara cam in miPlano.Camaras)
                        {
                            if (c.DirRtsp == cam.DirRtsp)
                            {
                                throw new Exception("Camara " + c.DirRtsp + " ya existe.");
                            }
                        }
                        miPlanoAdding.Camaras.Add(c);
                        miPlano.Camaras.Add(c);
                        break;
                    case 2:
                        int idO = int.Parse(keyO);
                        Luz l = new Luz(idO, false, y, x);
                        foreach (Luz luz in miPlanoAdding.Luces)
                        {
                            if (l.Id == luz.Id)
                            {
                                throw new Exception("Luz " + l.Id + " ya existe.");
                            }
                        }
                        foreach (Luz luz in miPlano.Luces)
                        {
                            if (l.Id == luz.Id)
                            {
                                throw new Exception("Luz " + l.Id + " ya existe.");
                            }
                        }
                        miPlanoAdding.Luces.Add(l);
                        miPlano.Luces.Add(l);
                        break;
                    case 3:
                        idO = int.Parse(keyO);
                        Sensor s = new Sensor(idO, false, y, x);
                        foreach (Sensor sen in miPlanoAdding.Sensores)
                        {
                            if (s.Id == sen.Id)
                            {
                                throw new Exception("Sensor " + s.Id + " ya existe.");
                            }
                        }
                        foreach (Sensor sen in miPlano.Sensores)
                        {
                            if (s.Id == sen.Id)
                            {
                                throw new Exception("Sensor " + s.Id + " ya existe.");
                            }
                        }
                        miPlanoAdding.Sensores.Add(s);
                        miPlano.Sensores.Add(s);
                        break;
                    default:
                        throw new Exception("Debe seleccionar un objeto válido.");
                        break;
                }
                return "Objeto agregado correctamente.";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        [WebMethod] // Atributo necesario para trabajar con servicios Webs 
        public static string getSensorStatus()
        {
            string listaObjs = "";
            int i = 0;
            foreach (Sensor s in miPlano.Sensores)
            {
                i++;
                if (i < miPlano.Sensores.Count())
                {
                    listaObjs += "sensor" + s.Id + ":" + s.Estado + "-";
                }
                else
                {
                    listaObjs += "sensor" + s.Id + ":" + s.Estado;
                }
            }
            

            return listaObjs; // Retorna una cadena conteniendo los elementos configurados
        }

        [WebMethod] // Atributo necesario para trabajar con servicios Webs 
        public static string getObjects(string message)
        {
            string[] misKeys = message.Split(' ');
            int i = 0;
            foreach (string key in misKeys)
            {
                try
                {
                    i++;
                    if (i == 2)
                    {
                        idPlanoProc = Convert.ToInt32(key);
                    }
                }
                catch (Exception ex)
                {
                    idPlanoProc = 0;
                }
            }
            string listaObjs = "";
            if (idPlanoProc > 0)
            {
                miPlano = FabricaLogica.getLogicaPlano().BuscarPlano(idPlanoProc);
                if (miPlano != null && idPlanoProc > 0)
                {

                    foreach (Camara c in miPlanoDeleting.Camaras)
                    {
                        var itemToRemove = miPlano.Camaras.Single(r => r.DirRtsp == c.DirRtsp);
                        miPlano.Camaras.Remove(itemToRemove);
                    }
                    foreach (Luz l in miPlanoDeleting.Luces)
                    {
                        var itemToRemove = miPlano.Luces.Single(r => r.Id == l.Id);
                        miPlano.Luces.Remove(itemToRemove);
                    }
                    foreach (Sensor s in miPlanoDeleting.Sensores)
                    {
                        var itemToRemove = miPlano.Sensores.Single(r => r.Id == s.Id);
                        miPlano.Sensores.Remove(itemToRemove);
                    }
                    // primero eliminamos, luego los agregamos.
                    foreach (Camara c in miPlanoAdding.Camaras)
                    {
                        miPlano.Camaras.Add(c);
                    }
                    foreach (Luz l in miPlanoAdding.Luces)
                    {
                        miPlano.Luces.Add(l);
                    }
                    foreach (Sensor s in miPlanoAdding.Sensores)
                    {
                        miPlano.Sensores.Add(s);
                    }
                }
                foreach (Camara c in miPlano.Camaras)
                {
                    listaObjs += "1" + "/" + c.DirRtsp + "/" + c.Ejey + "/" + c.Ejex + "-";
                }
                foreach (Luz l in miPlano.Luces)
                {
                    listaObjs += "2" + "/" + l.Id + "/" + l.Ejey + "/" + l.Ejex + "-";
                }
                foreach (Sensor s in miPlano.Sensores)
                {
                    listaObjs += "3" + "/" + s.Id + "/" + s.Ejey + "/" + s.Ejex + "-";
                }
            }
            return listaObjs; // Retorna una cadena conteniendo los elementos configurados
        }

        protected void btnGuardarConf_Click(object sender, EventArgs e)
        {
            miPlanoAdding.Idp = miPlano.Idp;
            miPlanoDeleting.Idp = miPlano.Idp;

            FabricaLogica.getLogicaPlano().EliminarColeccionesPlano(miPlanoDeleting);
            // primero eliminamos, luego insertamos.
            FabricaLogica.getLogicaPlano().AgregarColeccionesPlano(miPlanoAdding);
            miPlanoDeleting = new Plano();
            miPlanoAdding = new Plano();
            miPlano.Camaras = new List<Camara>();
            miPlano.Sensores = new List<Sensor>();
            miPlano.Luces = new List<Luz>();
        }

        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                cmbUsu.Items.Clear();
                ListItem i = new ListItem("Seleccione Plano", "Seleccione Plano");
                cmbUsu.Items.Add(i);
                lblMensaje.Text = "";
                Usuario usu = new Usuario();
                usu.Ci = int.Parse(txtCedula.Text);
                listCasas = FabricaLogica.getLogicaCasa().ListarCasas(usu);
                if (listCasas == null || listCasas.Count == 0)
                {
                    throw new Exception("Usuario no registrado.");
                }
                else
                {
                    cmbCasas.Items.Clear();
                    foreach (Casa c1 in listCasas)
                    {
                        ListItem i2 = new ListItem("Casa " + c1.Id + " - " + c1.Direccion, c1.Id.ToString());
                        cmbCasas.Items.Add(i2);
                        lblCasa.Visible = true;
                        cmbCasas.Visible = true;
                    }
                    Casa miCasa = FabricaLogica.getLogicaCasa().BuscarCasa(listCasas[0].Id);
                    foreach (Plano p1 in miCasa.Planos)
                    {
                        ListItem i3 = new ListItem("Plano " + p1.Idp.ToString(), p1.Foto + "@" + p1.Idp);
                        cmbUsu.Items.Add(i3);
                        lblIdPlano.Visible = true;
                        lblPregunta.Visible = true;
                        cmbUsu.Visible = true;
                        ddlElementos.Visible = true;
                        btnGuardarConf.Visible = true;
                    }

                    lblMensaje.ForeColor = System.Drawing.Color.Green;
                    lblMensaje.Text = "Hablitado para configurar Plano";

                }

            }
            catch (Exception ex)
            {
                lblMensaje.ForeColor = System.Drawing.Color.Red;
                lblMensaje.Text = ex.Message;
            }
        }

        protected void btnAux3_Click(object sender, EventArgs e)
        {
            try
            {
                imgPlano.Attributes["src"] = "";
                cmbUsu.Items.Clear();
                ListItem i = new ListItem("Seleccione Plano", "Seleccione Plano");
                cmbUsu.Items.Add(i);
                Casa miCasa = FabricaLogica.getLogicaCasa().BuscarCasa(listCasas[cmbCasas.SelectedIndex].Id);
                foreach (Plano p1 in miCasa.Planos)
                {
                    ListItem i3 = new ListItem("Plano " + p1.Idp.ToString(), p1.Foto + "@" + p1.Idp);
                    cmbUsu.Items.Add(i3);
                    lblIdPlano.Visible = true;
                    lblPregunta.Visible = true;
                    cmbUsu.Visible = true;
                    ddlElementos.Visible = true;
                    btnGuardarConf.Visible = true;
                }
            }
            catch (Exception ex)
            {
                lblMensaje.ForeColor = System.Drawing.Color.Red;
                lblMensaje.Text = ex.Message;
            }
        }


        protected void btnAux2_Click(object sender, EventArgs e)
        {
            miPlano = new Plano();

            if (cmbUsu.SelectedIndex == 0)
            {
                imgPlano.Attributes["src"] = "";
            }
        }

    }
}